package com.candy.dao;

import java.sql.*;
import java.util.LinkedHashMap;
import java.util.LinkedList;
import java.util.List;
import java.util.Map;

public class DBHelper {
//    将数据库连接对象返回方法
//    java中的方法
//  访问控制修饰符    返回值类型   方法名（形参列表）{方法体}
    public  static    Connection getconn(){
        String url="jdbc:mysql://localhost:3306/qlgjavaweb?serverTimezone=UTC&characterEncoding=utf8&useUnicode=true&useSSL=false";
//       数据库用户名
        String username="root";
//        数据库密码
        String userpwd="123456";
         Connection   conn=null;
//        加载驱动
        try {
            Class.forName("com.mysql.cj.jdbc.Driver");
//（2）获取数据库的连接对象Connection；
            conn= DriverManager.getConnection(url,username,userpwd);
        } catch (Exception e) {
            e.printStackTrace();
        }
        return conn;
    }
//    设计一个方法，执行增删改操作的
    public static  int update(String strsql){
//        获取数据库链接对象
        Connection conn=getconn();
        int num=0;
        try {
//            获取Statement对象用于执行增删改查操作
            Statement sta= conn.createStatement();
//            调用executeUpdate执行增删改查操作
            num= sta.executeUpdate(strsql);
        } catch (SQLException e) {
            e.printStackTrace();
        }
        return num;
    }
//查询方法
    public static ResultSet getInfo(String strsql){
//        获取数据库链接对象
        Connection conn=getconn();
        ResultSet re=null;
//        异常处理的快捷键：ctrl+alt+t
        try {
//            获取执行增删改查操作的Statement对象
            Statement statement= conn.createStatement();
//（4）执行SQL语句，获取数据操作结果或者结果集对象ResultSet；
            re= statement.executeQuery(strsql);
        } catch (SQLException e) {
            e.printStackTrace();
        }
        return re;
    }
//    问题：在查询时，ResultSet使用时，要保持Statement、Connection一直处于活跃状态，占用资源
//    将资源关闭后，无法再获取结果，此时应该怎么办？
//    数据转储
//    常用的转储方式有：List+Map 或 List+javabean 两种方式可以选择
    public static List<Map<String,Object>> query4ListMap(String strsql){
//        准备List集合用来存储查询结果数据
        List<Map<String,Object>> lmp=new LinkedList<>();;
    //        获取数据库链接对象
    //        异常处理的快捷键：ctrl+alt+t
        try(Connection conn=getconn();
//            获取执行增删改查操作的Statement对象
             Statement statement= conn.createStatement();
//             执行SQL语句，获取数据操作结果或者结果集对象ResultSet；
             ResultSet re=statement.executeQuery(strsql);) {
//            获取数据的结构信息，包括列名，多少列等信息
             ResultSetMetaData rm=re.getMetaData();
//           将每一行的数据放在一个map中，
            Map<String,Object>  mp=null;
//            re.next()是读取一行数据，下一行没有数据则返回false
            while (re.next()){
//                创建map实例对象，进行存储数据准备
               mp=new LinkedHashMap<>();

//               rm.getColumnCount() 方法获取该表中共有多少列
//                读取每一列的值
                for (int i = 1; i <=rm.getColumnCount() ; i++) {
//                    rm.getColumnLabel方法可以获取列名，
//                    re.getObject可以通过列名取该列的数据
//                    获取每一列的列名，作为map中的key值，通过列名获取该列的值，作为map中的value
                    mp.put(rm.getColumnLabel(i),re.getObject(rm.getColumnLabel(i)));
                }
//                将数据放入集合
//                将每一行的信息加入集合中
                lmp.add(mp);
            }
        } catch (SQLException e) {
            e.printStackTrace();
        }
        return lmp;
    }







}
